package edu.ustb.aur.chain;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ustb.aur.mapper.ChainMapper;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ShiZhe
 * @create 2021-11-17 10:26
 */
@Service
public class ChainServiceImpl extends ServiceImpl<ChainMapper,Chain> implements ChainService {

    /**
     * 插入数据
     *
     * @param chain 对象
     */
    @Override
    public void createChain(Chain chain) {
        int insert = baseMapper.insert(chain);
        System.out.println(insert);
        if (insert != 1) {
            System.out.println("插入失败");
        }

        //测试专用，此处增加上链成功标志
    }

    /**
     * 查询合约id是否存在，看执行createChain函数还是addContractTxIdList
     *
     * @param contractId 合约唯一id
     * @return true or false
     */
    @Override
    public boolean findContractIdIsExist(String contractId) {
        Chain chain = baseMapper.selectById(contractId);
        return chain != null;
    }

    /**
     * 根据合约id查找，返回chain实体
     *
     * @param contractId 合约id
     * @return chain实体
     */
    @Override
    public Chain findChainById(String contractId) {
        return baseMapper.selectById(contractId);
    }

    /**
     * 根据合约名返回交易id集合，因为合约名不唯一，可能有多个交易id集合
     *
     * @param contractName 合约名
     * @return 交易id集合的集合
     */
    @Override
    public List<Chain> findContractTxIdListByName(String contractName) {
        QueryWrapper<Chain> wrapper = new QueryWrapper<>();
        wrapper.eq("contract_name", contractName);
        return baseMapper.selectList(wrapper);
    }

    /**
     * 根据合约唯一id查询交易id集合
     *
     * @param contractId 合约唯一id
     * @return 交易id集合
     */
    @Override
    public List<String> findContractTxIdListById(String contractId) {
        QueryWrapper<Chain> wrapper = new QueryWrapper<>();
        wrapper.eq("contract_id", contractId);
        Chain chain = baseMapper.selectOne(wrapper);
        return chain.getContractTxIdList();
    }

    /**
     * 将新交易id插入已有合约id的交易id集合中
     *
     * @param contractId   合约唯一id
     * @param contractTxId 合约新交易id
     */
    @Override
    public void addContractTxIdList(String contractId, String contractTxId) {
        QueryWrapper<Chain> wrapper = new QueryWrapper<>();
        wrapper.eq("contract_id", contractId);
        Chain chain = baseMapper.selectOne(wrapper);
        List<String> contractTxIdList = chain.getContractTxIdList();
        ArrayList<String> strings = new ArrayList<>(contractTxIdList);
        strings.add(contractTxId);
        chain.setContractTxIdList(strings);
        int i = baseMapper.updateById(chain);
        if (i != 1) {
            System.out.println("更新失败");
        }
    }
}
